#include <iostream>
#include <vector>

class Widget
{
public:
	~Widget() {
		// throw 表达式 ： 表达式的类型决定抛出异常类型
		throw "11111";  // 抛出了，const char*类型的异常

		try {
		}
		catch (...)
		{
			std::cout << "如果一个被析构函数调用的函数可能抛出异常，析构函数应该捕捉任何异常，然后吞下它们（不传播）或结束程序" << std::endl;
		}
	};
	// VS 不允许析构函数“抛出异常”
};

void myThrow()
{
	throw "抛出异常";
	std::cout << "如果抛出异常，不在往下执行" << std::endl;
	throw "exception";
}

void doSomething()
{
	std::vector<Widget> v(10); // v有责任先销毁Widget,在销毁v自身
}  // v自动销毁


//int main()
//{
//	std::vector<int> v(1, 0);
//	try
//	{
//		// 保护代码
//		//throw v[1] = 1;
//		//doSomething(); 
//
//		myThrow();
//		std::cout << "函数如果抛出异常，不在往下执行" << std::endl;
//	}
//	catch (const char* msg)
//	{
//		std::cout << msg << std::endl;
//	}
//	catch (const std::out_of_range& e)
//	{
//		std::cout << "异常类型：" << e.what() << std::endl;
//	}
//	catch (const std::exception& e)
//	{
//		std::cout << "异常类型：" << e.what() << std::endl;
//	}
//	catch (...)
//	{
//		std::exception e;
//		std::cout << e.what() << std::endl;   // Unknown exception
//
//		std::cout << "捕捉任意类型的异常" << std::endl;
//	}
//	return 0;
//}



int main()
{
	doSomething();
	return 0;
}



// 如果某个操作可能在失败时抛出异常，而又存在某种需要必须处理该异常，
// 那么这个异常必须来自析构函数以外的某个函数


// 请记住
	// 1.析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常，析
	// 构函数应该捕捉任何异常，然后吞下它们（不传播）或结束程序。-- 已经不给抛出异常了
	// 2.如果客户需要对某个操作函数运行期间抛出的异常做出反应，那么需要另外一个class应该提
	// 供一个普通函数（而非在析构函数中）执行该操作。